package com.atguigu;

/**
 * 8皇后问题测试
 *
 * @Author 剧情再美终是戏
 * @Date 2019/12/24
 * @return
 * @Version 1.0
 **/
public class QueenTest {

    // 设置皇后的数量
    int max = 4;

    // 初始化地图
    int[] maps = new int[max];

    static int count;

    public static void main(String[] args) {

        QueenTest queenTest = new QueenTest();
        queenTest.put(0);
        System.out.printf("一共有%d种解法", count);
    }

    /**
     * 投放皇后
     *
     * @param n 投放第n个皇后
     * @return void
     * @Author 剧情再美终是戏
     * @Date 2019/12/24
     * @Version 1.0
     **/
    public void put(int n) {
        // 如果皇后投放到了max的数量，说明找到了一种新的解法，就输出这个结果
        if (n == max) {
            print();
            return;
        }

        // 投放皇后
        for (int i = 0; i < maps.length; i++) {
            // 将这个皇后设置为i
            maps[n] = i;
            // 判断这个皇后放得是否合法
            if (juade(n)) {
                // 如果这个皇后放得合法的话，就放下一个
                put(n + 1);
            }
            // 如果不合法的话，就不用管，它会回到maps[n]=i;这个位置，并将皇后后移一位，找到正确的位置
        }
    }

    /**
     * 判断是否合法
     *
     * @param n 投放的第n个皇后与之前的所有皇后是否合法
     * @return boolean 就否合法
     * @Author 剧情再美终是戏
     * @Date 2019/12/24
     * @Version 1.0
     **/
    public boolean juade(int n) {
        for (int i = 0; i < n; i++) {
            // maps[i] == maps[n] 判断投放的皇后是否在同一列
            // Math.abs(n - i) == Math.abs(maps[n] - maps[i])   判断投放的皇后是否在同一条斜线
            if (maps[i] == maps[n] || Math.abs(n - i) == Math.abs(maps[n] - maps[i])) {
                return false;
            }
        }
        return true;
    }

    // 打印方法
    public void print() {
        count++;
        for (int map : maps) {
            System.out.print(map + " ");
        }
        System.out.println();
    }
}
